﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Configuration;
using System.Data.SqlClient;
using System.Web.Configuration;

namespace TheBullysStore.Models.ModuloAdministracion.ReporteEconomico
{
    public class ReporteEconomicoDAO
    {


        public List<Registro> generarReporte(Filtro fil)
        {
            String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;
            List<Registro> listaAreaComun = new List<Registro>();
            SqlConnection sqlCon = new SqlConnection(cadenaConfiguracion);
            sqlCon.Open();
            try
            {
                float util = 0;
                Boolean entro = false;
                string commandString = "select t.descripcion,isnull(SUM(isnull(d.monto,0)),0) 'monto' from documento_de_pago d , tipo_gasto t where d.tipo_gasto=t.tipo_gasto and ((datepart(year,d.Fecha_Registro)= " + fil.anhoInicial + " and datepart(month,d.Fecha_Registro)>= " + fil.mesInicial + ")  or datepart(year,d.Fecha_Registro)>= " + fil.anhoInicial + ")  and ((datepart(year,d.Fecha_Registro)= " + fil.anhoInicial + " and datepart(month,d.Fecha_Registro)<= " + fil.mesFinal + ")  or datepart(year,d.Fecha_Registro)<= " + fil.anhoFinal + ") and d.Estado=1 and d.id_Edificio=" + fil.idEdificio + " group by t.descripcion ";



                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                while (dataReader.Read())
                {
                    entro = true;
                    Registro area = new Registro();
                    area.naturaleza = 1;
                    area.concepto = (string)dataReader["descripcion"];
                    area.monto = Convert.ToSingle( dataReader["monto"]);
                    area.total = 0;


                    listaAreaComun.Add(area);
                }
                if (!entro)
                {
                    Registro area = new Registro();
                    area.naturaleza = 1;
                    area.concepto = "Otro Ingreso";
                    area.monto =0;
                    area.total = 0;


                    listaAreaComun.Add(area);
                    
                }
                entro = false;
                dataReader.Close();

                commandString = "select isnull(SUM(isnull(d.monto,0)),0) 'monto' from documento_de_pago d , tipo_gasto t where d.tipo_gasto=t.tipo_gasto and ((datepart(year,d.Fecha_Registro)= " + fil.anhoInicial + " and datepart(month,d.Fecha_Registro)>= " + fil.mesInicial + ")  or datepart(year,d.Fecha_Registro)> " + fil.anhoInicial + ")  and ((datepart(year,d.Fecha_Registro)= " + fil.anhoInicial + " and datepart(month,d.Fecha_Registro)<= " + fil.mesFinal + ")  or datepart(year,d.Fecha_Registro)< " + fil.anhoFinal + ") and d.Estado=1 and d.id_Edificio=" + fil.idEdificio;



                 sqlCmd = new SqlCommand(commandString, sqlCon);
                 dataReader = sqlCmd.ExecuteReader();

                while (dataReader.Read())
                {
                    entro = true;
                    Registro area = new Registro();
                    area.naturaleza = 1;
                    
                    area.monto = Convert.ToSingle(dataReader["monto"]);
                    area.total = 1;
                    util = area.monto;

                    listaAreaComun.Add(area);
                }
                if (!entro)
                {

                    Registro area = new Registro();
                    area.naturaleza = 1;

                    area.monto =0;
                    area.total = 1;
                    util = 0;

                    listaAreaComun.Add(area);

                    
                }
                entro = false;
                dataReader.Close();

                commandString = "select 'Cuota mantenimiento' 'concepto',isnull(sum(isnull(monto,0)),0)'monto'  from cuota where id_edificio = " + fil.idEdificio + " and  ((anio=" + fil.anhoInicial + " and mes >= " + fil.mesInicial + ")or anio>" + fil.anhoInicial + ") and   ((anio=" + fil.anhoFinal + " and mes <= " + fil.mesFinal + ")or anio<" + fil.anhoFinal + ")  " + "  and Estado<>0  union all  select 'Consumo de agua' 'concepto',isnull(sum(isnull(costo,0)),0)'monto' from Consumo_De_Agua where id_edificio = " + fil.idEdificio + "  and ((anio=" + fil.anhoInicial + " and mes >= " + fil.mesInicial + ")or anio>" + fil.anhoInicial + ") and   ((anio=" + fil.anhoFinal + " and mes <= " + fil.mesFinal + ")or anio<" + fil.anhoFinal + ")  " + "   and Estado<>0  union all select 'Cuota extraordinaria' 'concepto',isnull(sum(isnull(monto,0)),0) 'monto'  from cuota_extraordinaria_x_departamento where id_departamento in (select id_departamento from departamento where    id_edificio = " + fil.idEdificio + ") and  ((anio=" + fil.anhoInicial + " and mes >= " + fil.mesInicial + ")or anio>" + fil.anhoInicial + ") and   ((anio=" + fil.anhoFinal + " and mes <= " + fil.mesFinal + ")or anio<" + fil.anhoFinal + ")  " + "   and Estado<>0 ";



                sqlCmd = new SqlCommand(commandString, sqlCon);
                dataReader = sqlCmd.ExecuteReader();

                while (dataReader.Read())
                {
                    entro = true;
                    Registro area = new Registro();
                    area.naturaleza = -1;
                    area.concepto = (string)dataReader["concepto"];
                    area.monto = Convert.ToSingle(dataReader["monto"]);
                    area.total = 0;


                    listaAreaComun.Add(area);
                }
                if (!entro)
                {
                    Registro area = new Registro();
                    area.naturaleza = -1;
                    area.concepto = "Otro Gasto";
                    area.monto =0;
                    area.total = 0;


                    listaAreaComun.Add(area);

                }
                entro = false;
                dataReader.Close();

                commandString = "select isnull(SUM(monto),0) 'monto' from(select 'Cuota mantenimiento' 'concepto',isnull(sum(isnull(monto,0)),0)'monto'  from cuota where id_edificio = " + fil.idEdificio + " and  ((anio=" + fil.anhoInicial + " and mes >= " + fil.mesInicial + ")or anio>" + fil.anhoInicial + ") and   ((anio=" + fil.anhoFinal + " and mes <= " + fil.mesFinal + ")or anio<" + fil.anhoFinal + ")  " + "  and Estado<>0  union all  select 'Consumo de agua' 'concepto',isnull(sum(isnull(costo,0)),0)'monto' from Consumo_De_Agua where id_edificio = " + fil.idEdificio + "  and ((anio=" + fil.anhoInicial + " and mes >= " + fil.mesInicial + ")or anio>" + fil.anhoInicial + ") and   ((anio=" + fil.anhoFinal + " and mes <= " + fil.mesFinal + ")or anio<" + fil.anhoFinal + ")  " + "   and Estado<>0  union all select 'Cuota extraordinaria' 'concepto',isnull(sum(isnull(monto,0)),0) 'monto'  from cuota_extraordinaria_x_departamento where id_departamento in (select id_departamento from departamento where    id_edificio = " + fil.idEdificio + ") and  ((anio=" + fil.anhoInicial + " and mes >= " + fil.mesInicial + ")or anio>" + fil.anhoInicial + ") and   ((anio=" + fil.anhoFinal + " and mes <= " + fil.mesFinal + ")or anio<" + fil.anhoFinal + ")  " + "   and Estado<>0   ) as t";



                sqlCmd = new SqlCommand(commandString, sqlCon);
                dataReader = sqlCmd.ExecuteReader();

                while (dataReader.Read())
                {
                    entro = true;
                    Registro area = new Registro();
                    area.naturaleza = -1;
                    
                    area.monto = Convert.ToSingle(dataReader["monto"]);
                    area.total = 1;

                    util = -area.monto + util;
                    listaAreaComun.Add(area);
                }
                if(!entro)
                {
                    Registro area = new Registro();
                    area.naturaleza = -1;

                    area.monto =0;
                    area.total = 1;

                    util = -area.monto + util;
                    listaAreaComun.Add(area);



                }
                Registro areaa = new Registro();
                areaa.naturaleza = 0;

                areaa.monto = util ;
               
                listaAreaComun.Add(areaa);






                dataReader.Close();
                sqlCon.Close();

                return listaAreaComun;
            }
            catch (Exception ex)
            {
                sqlCon.Close();
                return null;

            }







        }

       
      //  List<DiaReserva> listaDiaReserva = reservaDao.verListaReserva(idAreaComun, fecha);

   }


}